package br.com.werp.regras.pessoa.integracao;

import br.com.werp.regras.geral.Debuger;
import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.vos.tabelas.Contato;
import br.com.werp.regras.geral.vos.tabelas.Endereco;

import java.sql.Connection;
import java.sql.PreparedStatement;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Sobreira
 * Criado em 27/12/2004
 *
 */
public class ContatoDAO extends MasterDAO {
    public static final String APAGAR_CONTATO = "APAGAR_CONTATO";
    public static final String APAGAR_ENDERECO = "APAGAR_ENDERECO";
    private static ContatoDAO contatoDAO;

    private ContatoDAO(String banco) throws Exception {
        super(banco);
    }

    public static ContatoDAO getContatoDAO() throws Exception {
        if (contatoDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            contatoDAO = new ContatoDAO(bundle.getString(Constantes.BANCO));
        }

        return contatoDAO;
    }

    public void inserirContato(Object key, Contato contato)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, contato);
    }

    public void inserirEndereco(Object key, Endereco endereco)
        throws Exception {
        Connection connection = validarTransacao(key);
        inserirVO(connection, endereco);
    }

    public Contato obterContato(Object key, String pessoa, String tpContato)
        throws Exception {
        Connection conn = null;
        List list = new ArrayList();

        try {
            conn = (Connection) key;

            String where = " cont_pessoa = " + pessoa + " and " +
                "cont_tipo_contato = '" + tpContato + "'";
            list = preencheVO(conn, new Contato(), where);
        } catch (Exception e) {
            throw e;
        } finally {
            if (conn.getAutoCommit()) {
                liberaConeccao(conn);
            }
        }

        if (!list.isEmpty()) {
            return (Contato) list.get(0);
        } else {
            return null;
        }
    }

    public List obterContato(Contato contato)
        throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, contato);
        } finally {
            liberaConeccao(connection);
        }
    }

    public List obterEndereco(Endereco endereco) throws Exception {
        Connection connection = getConexao();

        try {
            return pesquisarVO(connection, endereco);
        } finally {
            liberaConeccao(connection);
        }
    }

    public void apagarEndereco(Object key, int contatoId)
        throws Exception {
        Connection conn = validarTransacao(key);
        String query = getQuery(APAGAR_ENDERECO);
        PreparedStatement statement = conn.prepareStatement(query);
        setInt(1, statement, contatoId);
        Debuger.debugar(statement, this.getClass());
        statement.executeUpdate();
    }

    public void apagarContato(Object key, int contId) throws Exception {
        Connection conn = validarTransacao(key);
        String query = getQuery(APAGAR_CONTATO);
        PreparedStatement statement = conn.prepareStatement(query);
        setInt(1, statement, contId);
        Debuger.debugar(statement, this.getClass());
        statement.executeUpdate();
    }

    public List obterContatos(String pessId) throws Exception {
        Connection conn = null;
        List list = new ArrayList();

        try {
            conn = getConexao();

            String where = " cont_pessoa = " + pessId;

            return preencheVO(conn, new Contato(), where);
        } finally {
            liberaConeccao(conn);
        }
    }
}
